/**
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package pittypat;

/**
 * 提供对标识符字符串的扩展方法。
 */
public final class IdentifierHelper {
	private IdentifierHelper() {
	}

	// 检查指定的字符是否是一个字母。
	private static boolean isLetter(char c) {
		return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
	}

	// 检查指定的字符是否是一个数字。
	private static boolean isDigit(char c) {
		return c >= '0' && c <= '9';
	}

	/**
	 * 检查指定的字符串是否是一个有效的标识符。
	 * 
	 * @param s
	 *            要检查的字符串。
	 * @return s 的长度大于 0，小于或等于 30，第一个字符必须是字母或下划线，其他字符可以是数字、字母或下划线。
	 */
	public static boolean isIdentifier(String s) {
		if (s == null || s.length() == 0) {
			return false;
		}

        // 长度不能超过 30
		if (s.length() > 30) {
			return false;
		}

        // 首字符必须是字母或下划线
		if (!isLetter(s.charAt(0)) && s.charAt(0) != '_') {
			return false;
		}

        // 其他字符必须是字母、下划线或数字
		for (int i = 1; i < s.length(); ++i) {
			if (!isLetter(s.charAt(i)) && !isDigit(s.charAt(i)) && s.charAt(i) != '_') {
				return false;
			}
		}

		return true;
	}

	/**
	 * 将指定的标识符转换为 Pascal 格式。
	 * 
	 * @param t
	 *            标识符字符串。
	 * @return Pascal 格式的标识符。
	 */
	public static String pascal(String t) {
		if (t == null || t.length() == 0) {
			return "";
		}

        // 如果第一个字符是下划线或大写字母，则原样返回
		if (t.charAt(0) == '_' || (t.charAt(0) >= 'A' && t.charAt(0) <= 'Z')) {
			return t;
		}

        // 如果长度为 1，返回大写形式
		if (t.length() <= 1) {
			return t.toUpperCase();
		}

		// 将首字符转换为大写
		return t.substring(0, 1).toUpperCase() + t.substring(1);
	}

	/**
	 * 将指定的标识符转换为 camel 格式。
	 * 
	 * @param t
	 *            标识符字符串。
	 * @return 格式的标识符。
	 */
	public static String camel(String t) {
		if (t == null || t.length() == 0) {
			return "";
		}

        // 如果第一个字符是下划线或小写字母，则原样返回
		if (t.charAt(0) == '_' || (t.charAt(0) >= 'a' && t.charAt(0) <= 'z')) {
			return t;
		}

        // 如果长度为 1，返回小写形式
		if (t.length() <= 1) {
			return t.toLowerCase();
		}

		// 如果所有的字符都是大写，则直接将所有的字符转换为小写
		boolean all = true;
		int c = 0;
		for (int i = 0; i < t.length(); ++i) {
			c = t.charAt(i);
			if (!(c >= 'A' && c <= 'Z') && c != '_' && !(c >= '0' && c <= '9')) {
				all = false;
				break;
			}
		}

		if (all) {
            // 没有任何字符是小写形式，要么是大写，要么是下划线，要么是数字
			return t.toLowerCase();
		}

		// 将首字符转换为小写
		return t.substring(0, 1).toLowerCase() + t.substring(1);
	}
}
